package com.iva.beam;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.iva.dao.mensajesDAO;
import com.iva.model.SgMensajes;
import com.iva.model.SgMensajesEnv;
import com.iva.model.VwAlumnosUsuario;
import com.iva.model.VwMsgEnviados;
import com.iva.service.findService;
import com.iva.service.mensajeService;

@Component("listMails")
public class MailListBeam implements Converter {
	@Autowired
	findService findServices;
	@Autowired
	mensajeService mensajeService;
	
	private  String TEMPUSER = "FF001";
	
	
	private String paraRenv;
public String getParaRenv() {
		return paraRenv;
	}

	public void setParaRenv(String paraRenv) {
		this.paraRenv = paraRenv;
	}


private VwAlumnosUsuario usuario;
	private String mensajeComp;
	public String getMensajeComp() {
		return mensajeComp;
	}

	public void setMensajeComp(String mensajeComp) {
		this.mensajeComp = mensajeComp;
	}

	public VwAlumnosUsuario getUsuario() {
		return usuario;
	}

	public void setUsuario(VwAlumnosUsuario usuario) {
		this.usuario = usuario;
	}

	
	private List<VwAlumnosUsuario> usuarios = new ArrayList<VwAlumnosUsuario>();
	private List<VwAlumnosUsuario> todosUsuarios;
	public List<VwAlumnosUsuario> getTodosUsuarios() {
		return todosUsuarios;
	}

	public void setTodosUsuarios(List<VwAlumnosUsuario> todosUsuarios) {
		this.todosUsuarios = todosUsuarios;
	}


	private String para;
	public String getPara() {
		return para;
	}

	public void setPara(String para) {
		this.para = para;
	}


	private String mensaje;
	private String asunto;
	
	private VwAlumnosUsuario vwAlumnosUsuario;

	
	private String[] listaMail;
	public String[] getListaMail() {
		return listaMail;
	}

	public void setListaMail(String[] listaMail) {
		this.listaMail = listaMail;
	}

	public String getMensaje() {
		return mensaje;
	}

	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}

	public String getAsunto() {
		return asunto;
	}

	public void setAsunto(String asunto) {
		this.asunto = asunto;
	}


	public VwAlumnosUsuario getVwAlumnosUsuario() {
		return vwAlumnosUsuario;
	}

	public void setVwAlumnosUsuario(VwAlumnosUsuario vwAlumnosUsuario) {
		this.vwAlumnosUsuario = vwAlumnosUsuario;
	}	

	public List<VwAlumnosUsuario> getUsuarios() {

		return usuarios;
	}

	public void setUsuarios(List<VwAlumnosUsuario> usuarios) {


		this.usuarios = usuarios;
	}

	public SgMensajes selectedMessage;
	
	
	public SgMensajes getSelectedMessage() {
		return selectedMessage;
	}

	public void setSelectedMessage(SgMensajes selectedMessage) {
		this.selectedMessage = selectedMessage;
	}
	
	public SgMensajesEnv sentMessage;
	

	public SgMensajesEnv getSentMessage() {
		return sentMessage;
	}

	public void setSentMessage(SgMensajesEnv sentMessage) {
		this.sentMessage = sentMessage;
	}

	public List<VwAlumnosUsuario> complateUser(String query){
		List<VwAlumnosUsuario> suggestion =  findServices.listVwAlumnosUsuario(query);

		return suggestion;
	}

	public void sendMessage(){
		try{
			if(!this.usuarios.isEmpty())
				System.out.println("total of selected "+this.usuarios.size() );
		}catch(Exception ex){
			ex.printStackTrace();
		}
	} 

	public void handleUnselect(UnselectEvent event) {  
		if(this.getVwAlumnosUsuario() !=null){
			System.out.println(this.vwAlumnosUsuario.getId().getFullMail());	
			if(this.usuarios != null && !this.usuarios.isEmpty()){
				for(VwAlumnosUsuario usuariosDTO : this.usuarios){
					if(this.getVwAlumnosUsuario().getId().getEmail().trim().equals(usuariosDTO.getId().getEmail())){
						System.out.println("index Element " + this.usuarios.indexOf(usuariosDTO));
						this.usuarios.remove(usuariosDTO);
						break;
					}
				}
			}
			this.usuarios.remove(this.vwAlumnosUsuario);
		}
	}  


	public void setDefaultMensaje(){
		Date date = new Date();
		String addtionalInformation = null;
		VwAlumnosUsuario dto = new VwAlumnosUsuario(); 
		HttpSession session = ( HttpSession ) FacesContext.getCurrentInstance().getExternalContext().getSession( true );        
		dto = (VwAlumnosUsuario)session.getAttribute("dto");
		addtionalInformation = "Asunto:" + this.asunto + "<br/>" +
				"Enviado Por:" + dto.getId().getNombreCompleto() + "<br/>" +
				"Fecha de Envio :"+ date.toString() + "<br/><br/>";
		this.setMensajeComp(addtionalInformation + this.mensaje);
		
	} 
	
	public void selectUsuario(SelectEvent event){
		event.getComponent();
		//this.getUsuariosConverter().getAsObject(context, component, value);
		if(this.getVwAlumnosUsuario() !=null){
			System.out.println("tiene datos");
			System.out.println("Index "+ this.usuarios.indexOf(this.getVwAlumnosUsuario()));
			System.out.println(this.vwAlumnosUsuario.getId().getFullMail());
			System.out.println("size "+ this.usuarios.size());
			this.usuarios.add(this.vwAlumnosUsuario);
			setTodosUsuarios(this.usuarios);
		}
		else{
			System.out.println("esta basia");
		}
		System.out.println("Asusnto " + this.asunto);
		System.out.println("Mensaje "  + this.mensaje);
	}

	public void resendMail()throws Exception{
		HttpSession session = ( HttpSession ) FacesContext.getCurrentInstance().getExternalContext().getSession( true );        
        this.usuario = (VwAlumnosUsuario)session.getAttribute("dto");
        setDefaultMensaje();
		SgMensajesEnv env = new SgMensajesEnv();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy 'a las ' HH:mm:ss");				
		SgMensajes msg = new SgMensajes();
		msg.setPara(this.paraRenv);
		msg.setAsunto(this.selectedMessage.getAsunto());
		msg.setCodigoReceptor(this.paraRenv);
		msg.setCodigoEmisario(usuario.getId().getNombreUsuario()); //Cambiar cuando se tenga el loggin
		msg.setFechaEnviado(sdf.format(new Date()));
		msg.setCuerpoMensaje(this.selectedMessage.getCuerpoMensaje());
		this.mensajeService.addSgMensajes(msg);
		System.out.println("Entra al bucle");
		
		env.setPara(this.paraRenv);
		env.setAsunto(this.selectedMessage.getAsunto());			
		env.setCodigoEmisario(usuario.getId().getNombreUsuario()); //Cambiar cuando se tenga el loggin
		env.setFechaEnviado(sdf.format(new Date()));
		env.setCuerpoMensaje(this.selectedMessage.getCuerpoMensaje());		
		this.mensajeService.addSgMensajesEnv(env);
		this.selectedMessage = new SgMensajes();
	}
	
	public void sendMail()throws Exception{
		HttpSession session = ( HttpSession ) FacesContext.getCurrentInstance().getExternalContext().getSession( true );        
        this.usuario = (VwAlumnosUsuario)session.getAttribute("dto");
        setDefaultMensaje();
		SgMensajesEnv env = new SgMensajesEnv();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy 'a las ' HH:mm:ss");
		if(this.usuarios !=null && !this.usuarios.isEmpty()){
			this.setPara(this.setMailListToString());
			for(VwAlumnosUsuario dto : this.usuarios){
				SgMensajes msg = new SgMensajes();
				msg.setPara(this.para);
				msg.setAsunto(this.asunto);
				msg.setCodigoReceptor(dto.getId().getNumeroEmpleado());
				msg.setCodigoEmisario(usuario.getId().getNombreUsuario()); //Cambiar cuando se tenga el loggin
				msg.setFechaEnviado(sdf.format(new Date()));
				msg.setCuerpoMensaje(this.mensajeComp);
 
				System.out.println("Entra al bucle");
			}
			env.setPara(this.para);
			env.setAsunto(this.asunto);			
			env.setCodigoEmisario(usuario.getId().getNombreUsuario()); //Cambiar cuando se tenga el loggin
			env.setFechaEnviado(sdf.format(new Date()));
			env.setCuerpoMensaje(this.mensajeComp);
			this.mensajeService.addSgMensajesEnv(env);
		
		}
		else{
			System.out.println("esta basia");
		}
		
		this.usuarios.clear();
		this.asunto = "";
		this.mensaje = "";
		
	}

	@Override
	public Object getAsObject(FacesContext context, UIComponent component,String value) {
		// TODO Auto-generated method stub
		if(value.trim().equals("")){
			return null;
		}else{
			try{		

				System.out.println("valor es " + value);
				for( VwAlumnosUsuario vwUsuarios: this.findServices.listVwAlumnosUsuario(value)){
					System.out.println("correo "+vwUsuarios.getId().getNombreCompleto());
					if(value.equals(vwUsuarios.getId().getNombreCompleto())){
						System.out.println("entra al if "+vwUsuarios.getId().getFullMail());
						this.setVwAlumnosUsuario(vwUsuarios);
						return vwUsuarios;
					}
				}
			}catch(Exception ex){
				ex.printStackTrace();
			}
		}

		return null;
	}


	@Override
	public String getAsString(FacesContext context, UIComponent component,
			Object value) {
		if(value == null || value.equals("")){
			return "";
		} else {
			System.out.println("entra al metodo " + value);				
			return String.valueOf(((VwAlumnosUsuario) value).getId().getNombreCompleto());
		}

		// TODO Auto-generated method stub

	}


	//Funcion que retorna el string 
	public String setMailListToString(){
		String listUsuarios = null;
		if(this.usuarios != null && !this.usuarios.isEmpty()){
			//se Construlle el correo para guardar el envio		 
			for(VwAlumnosUsuario vwUsuarios: this.usuarios){				
				if(this.usuarios.size() == 1){
					listUsuarios=vwUsuarios.getId().getFullMail();
				}else{
					if(this.usuarios.indexOf(vwUsuarios) == 0){
						this.para =vwUsuarios.getId().getFullMail();
					}else{
						listUsuarios = listUsuarios + "," + vwUsuarios.getId().getFullMail();
					}

				}				

			}
		}
		return listUsuarios;
	}
	
	public void verMail(SgMensajes msj){		
		this.selectedMessage = this.mensajeService.findSgMensajes(msj.getIdMensaje());
		this.mensaje = this.selectedMessage.getCuerpoMensaje();
if(this.selectedMessage.getCuerpoMensaje() ==null || this.selectedMessage.getCuerpoMensaje().equals("") || this.selectedMessage.getCuerpoMensaje().equals(" ")){			
	this.selectedMessage.setCuerpoMensaje( "<br/><hr/>" + this.selectedMessage.getCuerpoMensaje() );
	System.out.println("esta nulo");
		}else{
			System.out.println("no es nulo");
			this.selectedMessage.setCuerpoMensaje("<br/><hr/>"+this.mensaje);
			
		}
		//msj = this.selectedMessage;
		//return "dialog:verMensaje";
	}
	
	public void verSentMail(VwMsgEnviados msj){		
		this.sentMessage = mensajeService.findSgMensajesEnv(msj.getId().getIdMensaje());
		//return "dialog:verMensajeEnv";
	}
}
